{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. Linear Models for Classification"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "from prml.preprocess import PolynomialFeature\n",
    "from prml.linear import (\n",
    "    BayesianLogisticRegression,\n",
    "    LeastSquaresClassifier,\n",
    "    FishersLinearDiscriminant,\n",
    "    LogisticRegression,\n",
    "    Perceptron,\n",
    "    SoftmaxRegression\n",
    ")\n",
    "\n",
    "np.random.seed(1234)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def create_toy_data(add_outliers=False, add_class=False):\n",
    "    x0 = np.random.normal(size=50).reshape(-1, 2) - 1\n",
    "    x1 = np.random.normal(size=50).reshape(-1, 2) + 1.\n",
    "    if add_outliers:\n",
    "        x_1 = np.random.normal(size=10).reshape(-1, 2) + np.array([5., 10.])\n",
    "        return np.concatenate([x0, x1, x_1]), np.concatenate([np.zeros(25), np.ones(30)]).astype(np.int)\n",
    "    if add_class:\n",
    "        x2 = np.random.normal(size=50).reshape(-1, 2) + 3.\n",
    "        return np.concatenate([x0, x1, x2]), np.concatenate([np.zeros(25), np.ones(25), 2 + np.zeros(25)]).astype(np.int)\n",
    "    return np.concatenate([x0, x1]), np.concatenate([np.zeros(25), np.ones(25)]).astype(np.int)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.1 Discriminant Functions"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.1.3 Least squares for classification"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_train, y_train = create_toy_data()\n",
    "x1_test, x2_test = np.meshgrid(np.linspace(-5, 5, 100), np.linspace(-5, 5, 100))\n",
    "x_test = np.array([x1_test, x2_test]).reshape(2, -1).T\n",
    "\n",
    "feature = PolynomialFeature(1)\n",
    "X_train = feature.transform(x_train)\n",
    "X_test = feature.transform(x_test)\n",
    "\n",
    "model = LeastSquaresClassifier()\n",
    "model.fit(X_train, y_train)\n",
    "y = model.classify(X_test)\n",
    "\n",
    "plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train)\n",
    "plt.contourf(x1_test, x2_test, y.reshape(100, 100), alpha=0.2, levels=np.linspace(0, 1, 3))\n",
    "plt.xlim(-5, 5)\n",
    "plt.ylim(-5, 5)\n",
    "plt.gca().set_aspect('equal', adjustable='box')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_train, y_train = create_toy_data(add_outliers=True)\n",
    "x1_test, x2_test = np.meshgrid(np.linspace(-5, 15, 100), np.linspace(-5, 15, 100))\n",
    "x_test = np.array([x1_test, x2_test]).reshape(2, -1).T\n",
    "\n",
    "feature = PolynomialFeature(1)\n",
    "X_train = feature.transform(x_train)\n",
    "X_test = feature.transform(x_test)\n",
    "\n",
    "least_squares = LeastSquaresClassifier()\n",
    "least_squares.fit(X_train, y_train)\n",
    "y_ls = least_squares.classify(X_test)\n",
    "\n",
    "logistic_regression = LogisticRegression()\n",
    "logistic_regression.fit(X_train, y_train)\n",
    "y_lr = logistic_regression.classify(X_test)\n",
    "\n",
    "plt.subplot(1, 2, 1)\n",
    "plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train)\n",
    "plt.contourf(x1_test, x2_test, y_ls.reshape(100, 100), alpha=0.2, levels=np.linspace(0, 1, 3))\n",
    "plt.xlim(-5, 15)\n",
    "plt.ylim(-5, 15)\n",
    "plt.gca().set_aspect('equal', adjustable='box')\n",
    "plt.title(\"Least Squares\")\n",
    "plt.subplot(1, 2, 2)\n",
    "plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train)\n",
    "plt.contourf(x1_test, x2_test, y_lr.reshape(100, 100), alpha=0.2, levels=np.linspace(0, 1, 3))\n",
    "plt.xlim(-5, 15)\n",
    "plt.ylim(-5, 15)\n",
    "plt.gca().set_aspect('equal', adjustable='box')\n",
    "plt.title(\"Logistic Regression\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_train, y_train = create_toy_data(add_class=True)\n",
    "x1_test, x2_test = np.meshgrid(np.linspace(-5, 10, 100), np.linspace(-5, 10, 100))\n",
    "x_test = np.array([x1_test, x2_test]).reshape(2, -1).T\n",
    "\n",
    "feature = PolynomialFeature(1)\n",
    "X_train = feature.transform(x_train)\n",
    "X_test = feature.transform(x_test)\n",
    "\n",
    "least_squares = LeastSquaresClassifier()\n",
    "least_squares.fit(X_train, y_train)\n",
    "y_ls = least_squares.classify(X_test)\n",
    "\n",
    "logistic_regression = SoftmaxRegression()\n",
    "logistic_regression.fit(X_train, y_train, max_iter=1000, learning_rate=0.01)\n",
    "y_lr = logistic_regression.classify(X_test)\n",
    "\n",
    "plt.subplot(1, 2, 1)\n",
    "plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train)\n",
    "plt.contourf(x1_test, x2_test, y_ls.reshape(100, 100), alpha=0.2, levels=np.array([0., 0.5, 1.5, 2.]))\n",
    "plt.xlim(-5, 10)\n",
    "plt.ylim(-5, 10)\n",
    "plt.gca().set_aspect('equal', adjustable='box')\n",
    "plt.title(\"Least squares\")\n",
    "plt.subplot(1, 2, 2)\n",
    "plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train)\n",
    "plt.contourf(x1_test, x2_test, y_lr.reshape(100, 100), alpha=0.2, levels=np.array([0., 0.5, 1.5, 2.]))\n",
    "plt.xlim(-5, 10)\n",
    "plt.ylim(-5, 10)\n",
    "plt.gca().set_aspect('equal', adjustable='box')\n",
    "plt.title(\"Softmax Regression\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.1.4 Fisher's linear discriminant"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_train, y_train = create_toy_data()\n",
    "x1_test, x2_test = np.meshgrid(np.linspace(-5, 5, 100), np.linspace(-5, 5, 100))\n",
    "x_test = np.array([x1_test, x2_test]).reshape(2, -1).T\n",
    "\n",
    "model = FishersLinearDiscriminant()\n",
    "model.fit(x_train, y_train)\n",
    "y = model.classify(x_test)\n",
    "\n",
    "plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train)\n",
    "plt.contourf(x1_test, x2_test, y.reshape(100, 100), alpha=0.2, levels=np.linspace(0, 1, 3))\n",
    "plt.xlim(-5, 5)\n",
    "plt.ylim(-5, 5)\n",
    "plt.gca().set_aspect('equal', adjustable='box')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.3 Probabilistic Discriminative Models"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.3.2 Logistic Regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_train, y_train = create_toy_data()\n",
    "x1_test, x2_test = np.meshgrid(np.linspace(-5, 5, 100), np.linspace(-5, 5, 100))\n",
    "x_test = np.array([x1_test, x2_test]).reshape(2, -1).T\n",
    "\n",
    "feature = PolynomialFeature(degree=1)\n",
    "X_train = feature.transform(x_train)\n",
    "X_test = feature.transform(x_test)\n",
    "\n",
    "model = LogisticRegression()\n",
    "model.fit(X_train, y_train)\n",
    "y = model.proba(X_test)\n",
    "\n",
    "plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train)\n",
    "plt.contourf(x1_test, x2_test, y.reshape(100, 100), np.linspace(0, 1, 5), alpha=0.2)\n",
    "plt.colorbar()\n",
    "plt.xlim(-5, 5)\n",
    "plt.ylim(-5, 5)\n",
    "plt.gca().set_aspect('equal', adjustable='box')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.3.4 Multiclass logistic regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_train, y_train = create_toy_data(add_class=True)\n",
    "x1, x2 = np.meshgrid(np.linspace(-5, 10, 100), np.linspace(-5, 10, 100))\n",
    "x = np.array([x1, x2]).reshape(2, -1).T\n",
    "\n",
    "feature = PolynomialFeature(1)\n",
    "X_train = feature.transform(x_train)\n",
    "X = feature.transform(x)\n",
    "\n",
    "model = SoftmaxRegression()\n",
    "model.fit(X_train, y_train, max_iter=1000, learning_rate=0.01)\n",
    "y = model.classify(X)\n",
    "\n",
    "plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train)\n",
    "plt.contourf(x1, x2, y.reshape(100, 100), alpha=0.2, levels=np.array([0., 0.5, 1.5, 2.]))\n",
    "plt.xlim(-5, 10)\n",
    "plt.ylim(-5, 10)\n",
    "plt.gca().set_aspect('equal', adjustable='box')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.5 Bayesian Logistic Regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAATYAAAD8CAYAAAD9uIjPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8GearUAAAgAElEQVR4nO3dd5yU5bn/8c81fQsdKyDiigVUUAlqIBpr7GjUgB41xZIiaow5RmN+akxyNDHVaDBEOTHWo7GXqFijUVRElCbSVECpy1J2d/r1+2Nml9ndmdkyz9S93q/XvmRn5nmeexW/e/dbVBVjjKkkrmIXwBhjnGbBZoypOBZsxpiKY8FmjKk4FmzGmIpjwWaMqTgWbMaYvBORGSKyTkTmZ3hfRORWEVkqIh+KyEEp731TRJYkv77ZledZsBljCuHvwPFZ3j8BGJn8uhiYBiAiA4HrgUOA8cD1IjKgs4dZsBlj8k5V/w3UZ/nIJOAfmjAL6C8iuwBfA2aqar2qbgJmkj0gAfA4UejuGjBwkO46dGja90LxKH5vYYqlGgTA7/YW5HnGFMrcOQs2qOoOudzj6OMmav3Ghq4+bwEQTHlpuqpO78bjhgArU75flXwt0+tZFSXYdh06lIeeeSHte8sa1wNQt9PAgpQlGF3CHn1z+u9vTMkZGBj9aa73qN/YwMtvPtTV5wVVdVyuz3RKyTVF62oSIbNsbbZaq3MCnpEs37K+IM8yxmS0GhiW8v3Q5GuZXs+q5IINCh9ugIWbMcX1JHB+cnT0UGCzqn4BPA8cJyIDkoMGxyVfy6okgw0KG24Bz0jAws2YfBGRB4C3gL1FZJWIXCAi3xOR7yU/8iywHFgK/A34AYCq1gO/AN5Nft2YfC2rovSxdVVdzQ4sa1zPsrX1ee9zC3hGEowuyeszjOmtVPXsTt5X4JIM780AZnTneSVbY2tR6Jqb1dqMKX8lH2xQ+D43CzdjyltZBBsULtysv82Y8lc2wQaFDzdjTHkqq2CDwoab1dqMKU9lF2ywPdwKwcLNmPJTlsEGyakg1t9mjEmjbIMNLNyMMemVdbBBYcPNGFMeyj7YoDDhBlZrM6ZcVESwtchnuFmT1JjyUTHBVohpIBZuxpSHigk2KGy4GWNKl2PBJiJuEXlfRJ526p49Uahws1qbMaXLyRrb5cAiB+/XY4VanWDhZkxpciTYRGQocBJwpxP3c0K+w83624wpXU7V2P4IXAXEM31ARC4WkdkiMntTfWG2HypUuBljSkvOwSYiJwPrVPW9bJ9T1emqOk5Vx9XW9s31sV1WiHCzWpsxpcWJGtsE4FQR+QR4EDhKRO7t7KKVK9Y58OiuKUSfm4WbMaUj52BT1WtUdaiq7g5MAV5W1XOzXeP3eKgbPJCVK9YVLODyGW7W32ZMaSnqPLa6wYkDWizcjDFOcjTYVPVVVT25O9dUYrgZY4qrJFYeVFq4Wa3NmOIqiWCDygo3sCapMcVUMsEGiXAr5KBCvsLN+tuMKa6SCrYWhay95TvcjDGFV5LBBpUTblZrM6bwSjbYoDjhlg8WbsYUVkkHGxQ+3Ky/zZjyV/LBBoUdVLBwM6b8lUWwtShU7S2f4WaMyb+yCjYo/3DrSq1N49vQ6EpUI44+35jeouyCDQrb75aPCbyZwk01gm79E9R/BzZfDfXfRJufdPz5xlS6sgw2KEy45WMaSNb+tsbpEHoTiII2gwah8QE0+B/Hnm9Mb1C2wQaVFW6qIQj+G2jf/AxB8BHHnm1Mb1DWwQaFGTHNZ7i1im8DJP2H45sce64xvUHZB1uLfNfe8hVurbU21wAQf/oPevZx7JnG9AYVE2xQnuEGiSapiAtqLgBSw01AAlB9jqPPM6bSVVSwQfmFW2p/mwQOh77XgHc/cO0A/onQ7xbEM8yRZxnTW1RcsEGZh5vvAKTfjcjAvyJ9rkA8Qxx5hjG9SUUGG+R/UCFf4WaMyV3FBluLfNbe8tHnZutJjcldxQcblE+42WJ5Y5zRK4INLNyM6U16TbCBhZsxvUWvCjYov3AzxnRfrws2yO+IqdPhZrU2UylE5HgRWSwiS0Xk6jTv/0FE5ia/PhaRhpT3YinvdbrlTa8Mthb5qr05PVpq4WbKnYi4gduBE4BRwNkiMir1M6p6haqOVdWxwJ+BR1Pebm55T1VP7ex5HgfLXpbqBg9k2YZ6Vq5Yx7AROzp335odWNa4nmVr66nbaWCP7xPwjCQYXcLyLevZo2/+Dpwxpr1QLOLkL9XxwFJVXQ4gIg8Ck4CFGT5/NnB9Tx/W64MN8h9uubJwM8UgEuhOX+9gEZmd8v10VZ2e8v0QYGXK96uAQ9I/V4YDI4CXU14OJO8fBW5W1cezFcaCLSmv4bZ2fU61NtgebsaUqA2qOs6he00B/qmqsZTXhqvqahHZA3hZROap6rJMN+jVfWzt5bPPzQYTTC+3GkjdzWFo8rV0pgAPpL6gqquT/1wOvAocmO1hFmztlHq4gQ0mmLL0LjBSREaIiI9EeHUY3RSRfYABwFsprw0QSWxWKCKDgQlk7psDLNjSytd0ECfCzSbvmnKkqlFgKvA8sAh4SFUXiMiNIpI6yjkFeFBVNeW1fYHZIvIB8AqJPraswWZ9bFnkq9/NRkpNb6SqzwLPtnvtunbf35DmujeB/bvzLKuxdcLppqlTc9ys5mZMZjkHm4gME5FXRGShiCwQkcudKFgpKfVwM8a05USNLQpcqaqjgEOBS9rPKK4EpRxuVmszpq2cg01Vv1DVOck/byXRMViR+1mXarhB5TRJVRWNbULjjcUuiiljjvaxicjuJOaXvO3kfUtJ6oipI/dzINwqpb9NI4uhYSps+i7UfxvdfD0aszNVTfc5FmwiUgs8AvxQVbekef9iEZktIrPr6zc69diicXI6iIUbaGwjbPk5xL4g0bsRhchC2HIdbUf+jemcI8EmIl4SoXafqj6a7jOqOl1Vx6nquIEDBznx2KJzsmna68Mt+AJotN2LMYhvhOiiohTJlC8nRkUFuAtYpKq/z71I5aVUw63UqCoaXYvGGtJ/IP45iZpaewKxMgxqU1RO1NgmAOcBR6VsBHeiA/ctG6UYbqVUa9PwPNh0ETRcDpsuRhuuRWPtfj7PKMCf5uIoeOoKUk5TOZwYFX1DVUVVD0jZCO7Zzq+sLKUWblAaTVKNroEt/wPxeiAMRCG6GLZc37bvzP9VcPUB3ClX+8A3DvEMLWiZTfmzlQcOKqVwK5n+tuDzQKzdi/Fk39lHra+Iqwr6/xYCx4JrALh3guqzoc+Pcnq8ahgNvoJum4Y2PYnGt+Z0P1MeLNgcZuHWTnwtafvOVKBdc1RcfZHai5GBdyEDpiHVk0jsKN0zGt8CDZdC498gOBOa7odN30ejn/b4nqY8WLDlgZNz3co+3Lz7k7bvjMx9Z6qKaiT3ZzfdlwhPDSZfCIM2wbZbc7+3KWkWbHnk1Fw3p8KtKPxfBXdf2m4k44fARMSzc5uPqobQbdNg4xTYOAVtuBKN5LBrcGgWHZvBQPQzNN7U8/uakmfBlmdONU2dCLdi1NrEVQX9fguBE8G1A3h2g5pvQ83Ujh/ecgsEXwUigEJ0RWKQIbqmhw/PtiuX/dWvZPZftwAs3Pogtd9CBv4V6f9HpOo4EtMft9PoGojMIxFqqW9EIPhUzx7sPwbwtnvRBd79EVegZ/c0ZcGCrUCcDrdcFH2kNJ34FyDtQwggBj3t7K8+Ezz7kOjj84FUgXtHqL00h4KacmA76BaQUzvy5nLyVcnuvuselqiddeCBHvYRinjRfjdAdCnEVoBrR/CO6VBbNJXHamwF5mTNrWxHStMQ92DwHwr42r2jIH3QeHPP7iuCeEcigeMQ31gLtV7Cgq0ILNwyqL0Uqk4HalJejEHzw9BwWeZ1psa0Y8FWJBZuHYl4kJrJ4Bnc7p0QxBug+f6ilMuUHwu2InJylUKmcJv9wgf8YvLv+fHRN3DbpXex8uPP27xfaruBaHwbRFeleScGodz2L9VYPdr4ALrlJrTpEVteVcEs2IrMiVUKmaaBvPTA69z7i3/yxfK1NG1pZuGsj/ndhdNYvfSLNp/L9zQQjTejwZnotrvR4OudrCrItoRKe7zppEZXJJZXNT8G4Xeh6WHYNBWNOnswtikNFmwlItdVCu3DLRqN8swdMwkHw20+FwlGeOqOmR2uz1e4aXQNbPo+bJsBwSegcRo0XJpYx5mGuKrAewBp/2pqMzT+vWcF2faXxPWt61bDoNugqYf3MyXNgq2E5No0TQ23hrVbiKep3agqny1K19RL6CzcNLII3XIL2nA12vRwoumYzbbbQbcCoeQNghDbCI13Z76m9lKQPmneiEHwX90+B0E1AtHl6d6ByPvdupcpDxZsJcapcNsQC6OxeNrPDNplAABKFI1vQEnU6jobTNDgi7D55xB+C6IfQ9M/oeFHGfuqEoGyEGgfsDEIz8r4M4i7P3hGZHjTm5iX1i0uMjdx0y3Q307jQbR5JrrtdrTpCeuXKxMWbCXIiXDz+n3sc8qB+PxtZ/P7Al5OuPAY4sGn0PpvopumohvPJ974d5R4xnBTjUDjDCC1aRtJjlY+naEkkvxKp5O/eu4d0l+rUWh+Gm34Cdp4f8YmbZtSiBv8h9FxPro3sf9bBhrblDg1q3EGBF+Cpgdg0w/Q6MpOn2mKy4KtRDkRbsecfwT7nnYwXr8Xj89Dn4G1nHPtGewzdjU03p/scwonvoLPo42J6RRpwy36CelDKgqR2WnLIOIB74F0/GvmAf/h2X+AwEl0XOcJEIHoPIgugebHoeHyrjVNa74Lnj1A/ImlVfjANwaqv5H5mqZ7IL6Z1mY0YdBG2HZb588zRWVLqkpYrkuwRvbdGdd5R3Dk2RPZpaaKmn41uESIN1zC9v9ZW4Qg+CRx986I/8sdl15JH9A0WwABWUcya38AW66B+NbEkinxgHsXqD43a9nFsxva54pEpz+R5LNjQGrzOpq4b/MjUHth9vu5qqH/zYnR0ejn4NkN8QzLeg3hd0i/7dEyVEOIZG/GmuKxGlsRBRtDNKzfknUKgxM1N7fHzbpQGFfLcqJ4phpOFBrvQjddiEYXtKm5iWfnxJZD6Wpt0U/Q4Ftp7yjuAdD/dqj9IVRPSezPRg00TkMjH6W9pvVa/yEwcAb0+zX0/RnpAzSe6PPrIvGMQAITOg81IPPvfcH+1ylt9l+nCJq3BZl+1T1cdczPuf60X3PtSTcx/43M/5M7OVoKgHv3LJ8OgQbRLTejRNs2S/tcA6Tb7icKTXdmDGgRd2In3eDLib6q6HwIvQGbb0Cbn8tadhF3IoTcQ+mwpVGLfG0aGTiajs1hN/gOQtLuRGJKhQVbEUz/73uY/8YiopEYkVCUhnWbufPqe1m5+POM1zgZblLzLTouNm8vBpHEQcUt4SbuAZDpDIL41uS0jgy2/Tl5dmhqOIWh8e9dW+Du6p/lzXCW93JQPRk8e5EYOU32zbl3gdpL8vM84xgLtgLbsKqe5R9+SjTctu8mGo7y0n2vZ73WqXBbvnEw0u+X4B1L9ubW9v6s1gm8rn6ZPy9Vad/R0LuZp3eIu0vTN0QEpDr9m66+nV7fEyI+6Hdj4qv2O9Dnauj/JyRPzzPOsWArsPo1DXi8HWs98biy7rMNnV7vXLgNxNX3OqTPD0HSNS8VvKPavBLwjGRZ7MTEyGIbPvAdCtGl6c8SaH6YjnPZWh4TB1dt1wpfNYmO8878EJjUtet7YPu2R8civv1t26MyYcFWYLvuuRPRSMfj6DxeNyMP2qNL93C0z813GHjHpISbB/AhtVcgaaZbVFVPYVn8VFqbZngSNanwLNjyK6j/Ntr4YNv+tniWwHb176TPL/XhZ0DgOMC7fcpG4MRk4BmznU33KLDa/jUcftZhvPHI24SaE31DLrcLf7Wfo86Z2OX75DoVpK5mB5Y1rmf52k3ssdNVEF2EhueA1CL+ryCuQWmvEwSX/xiWcwR7VMeg8S6ILASi23fADT6R6OwPJH8ez17JqRMd70bf67pcCxJxQe230eopiQOXXYPt7AKTltXYiuDrl5/EmVeeys4jdqTvoFrGfW0sV997Gf0Gp1sfmZljzdK1mxDPKFzV5+KqOi1jqLUIeEYieFneGNseaqk0lAi3FtXnpGnueqHme4hnl26XW1xViGeohZrJyGpsRSAiTDjtS0w47Us538upmtuytfXdOkMh4BlJc/gtljX3p64qTVMzZamTeHZD+92cOIk9ugRcg6DqLMSf+89vTDoWbBXAqXDrroBvPM3iYVlzX+qqUtdsusE3ts1nxbMb9L26288wpiesKVohnGiWdneLccFNoOYSwMuy5pYpEMnBhKosazArjMa3oNEv0IxLzkyhWY2tgtQNHsjyDz/ljukv4o5FOfCo/TnwmANwe7LtSptyfQ+O9XP5J1Dl3pHmpntYFqqnrv/eEDglsfVQhdP4Ntj6h8RBz+IBvGjNd5HAl4tdtF7Pgq2CvHjvv3n6jheIhKKEB1WxcNYS3njsHS77y0W43F2rnPck3MQzkuq+NxKMLmFFDPboBaEGwJabEn2GRBPbKRGEbbei7h0Qb2mdJdHbWFO0QmzdtI2npj1POBhBVfFuaCIcg08XrWLuK/O7da+ennxVaqde5ZNG1yRXTLSfkxiG5ifSXWIKyIKtBH309hJum3oXv5z8e/75+6fYvKHzXVuXvLeiQ5OzJdzmvDSvR+UodrhpdCUafAUNz+vxIS55o/XJ5mca8coP9lJnTdES8/ojs3jkD8+0HsKy9tMNvPPs+1z74BVZ57n5a9LvDeavb0Y93d+JoqfTQICOe7l1k2oMtv4OwnNAXICAqz/a9xeIu3tlyRv38GTzsz1PYicTU1SO1NhE5HgRWSwiS0XExvR7KBKK8Oifnm1zslQsGqO5McjMf7ya9dp9vlSH29vx95TH5+HkU8b3aLQ007F+XZFTza356USoEU4c/qLNEFub6KgvEeKqgarT2q2bdSeWegVOKVq5SllnOSEi3xKR9SIyN/l1Ycp73xSRJcmvb3b2rJyDTUTcwO3ACcAo4GwRGZX9KpPOmk/Wk251USwSY+FbH2e91u1xc+ltF1Dbv4ZAjZ9AjR+v38Ppl53I8H2H9vjsUqfCTaNr0G1/TZxVsG0aGv0i84Wh5+m4FVEcootL6zCV6ilQcwl46sC1IwSOgf5/QNyZdkDpvbqRE/+nqmOTX3cmrx0IXA8cAowHrheRAdme50RTdDywVFWXJwvxIDAJWOjAvXuVPgNqiEbSz4Xqt0PnW+Xsts8QbnruZyyZs5xQU4g9D9qDmr5ttxLqySTeXJulzaFXWbZmGnWBjSQCahmEXkf73Yh49ux4kWbaX022r0ctASKSWA8b6Poa314sl5z4GjBTVeuT184EjgceyHSBE8E2BEg9tmcViWRtQ0QuBi4G2HWXIQ48tngSZ3OuZuPnmxi69y7sOGywI/ftv2M/6sbuztL3VxBLCThfwMcx5x3RpXu4PS72GZ8mLMhthUIu4eYPvkBQQyxrrk2uUIgnmpjb/gb9f93xAt+hEHyBDiOO7sHgSv+LWuNbIPwfiDeDbwziqetWGU1HoUi0OzX1wSKSeqrPdFWdnvJ9l3ICOENEDgc+Bq5Q1ZUZrs0aIgUbPEj+kNMB9t9vTIkNcXVdY0MTf556J2s/XY+4hFg0xgFHjOZbN07B7cm9y/LCm8/lzp/cy/IPP8HtcaNxZdLUExh92F4OlL5I4Rb9mAAugsTbLr+KLkFVO+7uUT0ZIu9CbAuJQ2c8iRHI2svS7gSi4bmw5eaWh0HTQ2hgAtRMtf3TcuB3eVq7Irpgg6qOy/GRTwEPqGpIRL4L3A0c1ZMbORFsq4HUkzGGJl+rSP+48WFWL1vTpkY1798Lefn+1zn2/K7VqrKp6VvF5dMuYtPazWyp38ouI3bCF3B2f/2Ch5sEQJs6hptUpQ0ecfVB+/0JQq8nzkdw7QqBY9OOiKpGYOsttO2TC0PoLfAeCrbQvlR0mhOqujHl2zuB36Rc+9V2176a7WFOjIq+C4wUkREi4gOmAE86cN+SE2oOs/CtxW1CDSAcjPDaw10/KakrBuzUj+H7DnUs1CKhCGs/20CwMXHsXi5rS9sPKMx9dT43nHELUw+5hmtP/h/eeqrdOaOB42k5YyGQ/Cu3rHkQ+L+GqqJppk2IK4BUHYv0uQKpmZx5mkckQxeNBiH0Srd/NpM3neaEiKTuYXUqsCj55+eB40RkQHLQ4LjkaxnlXGNT1aiITE0+yA3MUNUFud63FEVD6eYtJbRsGllqVJUX7n6V52Yk/iePx2IcevI4vvHfpzpSc3v+udn865ePEw4lOvU3rd3M//3mCaLRGF85PdGFItVT0Pj6RC1KfAQ0TNC7N8u2baYuOBmIoZ49ofZ7iGdEd3/CHr5nCilTTojIjcBsVX0SuExETiXRuVoPfCt5bb2I/IJEOALc2DKQkIkj89hU9VlV3UtV61T1V07csxTV9K9m8K4daw5ut4v9J+5bhBJ17u1n5vDcnS8TagoRagoRCUV5++n3ePzWZ4Hca26vPfQmTTVtfz+Gg2GemvY8mgwWwYOr9gpkwB1In6uRAdMIaAwic1nWXA1oYs3l5p+hsW5OK/GOTv+6BMB/ZLd/JpM/6XJCVa9Lhhqqeo2qjlbVMap6pKp+lHLtDFXdM/n1v509y5ZUddO5152Fv8qPO3kgi8/vpaZ/Naf+4Lgilyy952a8TCjYtjYZDkV4/dG3iUUTTepcwq3pvcQmk9GBbaeVNG1uJtKuhiuugYh3v8QmlNEVBJLB17rlkUYgmLWF0YGIF/r8mERT10fitCw/+A4Bn/Wv9Va2pKqb6sYM52cPXcG/H57F2k/XUTdmd7582vgO88VKxZaN6Se0xqJxgk3h1nL3tFk6aMhAIivWEdnNR3RgFZ76xBmh1X2r8PozraX8IrFUSuk4oBD7pFs/H4D4DkQH/DUx3UObktM9bHeN3syCrQcG7TKA0y87odjF6JLho4ex+J2O53bWDqihuk/bMwN6Em6TLjmBGT+7Hz4Lt4ZbdVOMky4+FiHDVAv3MEjZlHF7uA2krjr9HLzOiLsfVJ3Yo2tN5bGmaIU7/bIT8Qd8baZV+AJezrry1LRTLbrbLD3giFGcf/03GLTrQLwrw9T0r+ErlxzL4WcdmvEacQ8D336QcrxfADeIj+URaz6a3FmNrUC2bNzKrGfeo/6LBkYeXMfYr47q8s62udhtnyH8+O8/4Ok7XmTlolUMHjaIEy48mr3HZZ6Z392a20HHHEDd2N1Z8t7yRBN0dD+Wr92UdZ6b9PkJ2vQgBGcmllD5xlBV/W1CurXHu4IY08KCLQ9Ulfdfms8bj79NNBxlxH7D+ffDbxKPxxOjks/M4bkZA/nxnd/HX51+uyEnDdlzF7772/O6dU13wu3ZO1/k+f99BbfHhYjg8Xo47dYzE/fJEG6CF6k+D6rblivAzjlteWQMWFM0L+6/6THu+flDfDRrCUvnrGDmPa8Sag63jhKGmkKs+3Q9L973epFLml1XmqUfz17GzH+8RjQcJdQUJtgYYltDI09c8Siq8R49tzftxGvyw4LNYWs+Wc87z8xpO2E3zTzRSCjK7OfmFq5gPdRZuL3+2NuE00xODjeHYWlTj7Y7Ags3kxsLNod9PHtZprHADjze/PexOSFbuAW3BdNeI5IIt56enwAWbqbnLNgcVtO/BunCLh++gI+JX0+3a0thLZy1hF+fdys/OuI6bjr3Vha8uTjt51rCrb2Djz0AX5Wvw+uxaJw9xuyeuNbCzRSYBZvD9p+4D25X+n+t/iofPr8XX8DLvoftxcSvZ54SUQjzXl/E9Cvv5tNFqwk2hlj50Wr+9t/38MFr6ReWp9uFd9zxYxm2966t4SYuF16/l8k/mUQgZWDEws0Uko2KOswX8HLZtIuYdsXdBJuCCCAu4fwbJoPC5g2bGbH/cIbtvavjz25saGJrQyODhwzAk+b8g/Ye/eMzrYvXW4RDER7949OMOSLz7u6pI6Uej4fLp13M3Ffm8+GrC6jpX8OE08czZM9d0l7bk40qITXclthoqemUBVse7LbPEH71zDWsXLSKaCTG7vsNy+uctVBTiLtveIj5b3yE2+NGBL7+w5OYeHr2pu66lRvSvr5hVX36DSBJPw3E7XFz8LFjOPjYMVmfl8suvC0CnpEWbqZT1hTNE5dLGD56GHVjd3cs1FSV5fM+44nbn+O5GS+zYXWiaff36xKhlphyESLYGOKfv3uaBZ0cANNvcPpzFPoMrM2686yTe7n1RCLc1lvT1GRkwVYmVJX7fvkIt37/b7zw91d5ZvqL/OIbv+e1h95iwZuJUEsVDoZ54e/ZN1o84YKj8Afadvz7Az5OuPDoTstTCuEG1u9m0rNgKxOL313Gey98QDgYRlWJRWNEQhEe+ePTGc9aaFi7OeP9YtEYG1bXE41tX4zur/Jx0veO5fAzuzaoYeFmSpUFWxepKp8uXMXbz77Pp4tWFfz5770wN+0uvW6Pm1i04wx/l9vFyIMz70b74M2P89pDb7bZ5jwejzPy4D26dQCKhZspRTZ40AWhphC3XTaDVYs/T8w8VWXo3rsy9dbvFGStJ4DL7UZEUG23jEHgkBMP5N3nPmg9Qd7lduGv9nHCBcekvVfjlmbefnZOh+ZrNBzjubteabOuVFVZ8J+PeOOxdwgHI4z72lgOOfHANv2GxTrWr0XAM9LWl5o2rMbWBf/8w9N8unAVoeZwYovt5jCfLlzFI396tmBlGH/iQXj9aQ52iSln/ugULrz5HOrG7s6gXQdyyEkH8dP7fsigXdOfwVn/xaa0qx5UlTUr1rR57dE/PcNd19zPh68t5KO3l/DwLU/w56l3EYu1rSVmmsDbFVZzM06zYOuCd599P03tJsq7z84pWBnqxgznyHMm4PV78Po9rZN9L7j5HPzVfvabuC9X3vl9fvHkTzjvurMyhhrA4CEDW7cFT+VyCcP2Gdr6/YbV9fz74bfaNIFbQn3+Gx91uD7dBN4u/3wWbsZB1hTtgmiaEAA6hF2+TfrB8Rx2yjgW/GcxvoCPsUeOpqZfddZrtjH0iFsAABDYSURBVDU08tBvn2Tuy/PQOOw3cR8mXzWJw8/6Mq//c1Zr8xXA6/Ny/He2n0/78exluNKsogg1hZj/xqK0k3jrBg9kWQ+apGDNUuMcC7Yu2GtcHYvfWdqmf0tE2OtLmTdrzJcdhw1mxymDu/TZWCzO7y6YxoZVG1ubjh+8uoBlcz/hF09dTf/BfXnx3n/TuKWJ4aOGcuYVJ7Nr3U6t11f3rQJXx4EEt8dN7YDarM/uSX8bWLgZZ1iwdcHkn5zGLd+6jUgoSiQUwef34g14+cZVpxW7aFkteutjNq1r6NAftq2hkcf//C8mXzWJo8/9SsbrR395b9zujjU2t9vFYaccnPG6XAYTwMLN5M762Lpgx2GDOP/6yew2aii71O3E4d/4Mjc88t/stFvXak7FsuaT9USCkbTvzXpqNvF49gOFvX4vl95+IX0H9cFf4ydQ48df7ef8n09mx2HZf/ZcpoGAc31uTq5S0HgTGt+S831M/lmNrROqyv/+vweZ99pCwsEwLrebjaveZJe6HTns5HHFLl5WO+++Q8az0MPBMIveXsLow/bKeo/h+w7lV8/+lE/mryQajjBi/+H4AmlGZ9MohZob5F5709hG2PpHiCa2dFLPrlB7eQ9OrTeFYjW2Tiz4z2LmvbaQUHMY1cSM/XAowoM3PU7ztuZiFy+rfQ/bK+M6VVX424//weqlX3R6H7fbRd2Y4ez9pT27HGotSqHmBj0fMVWNw5ZrIboQiCa+op8lTq232lvJsmDrxHszP0g749/lcbFoVsfzOkuJ2+3irCtPxZWmnwwgEo7y9F9fzHs5cpnjBkUOt8gHEN9Kh/3dNQbB7GtxTfFYsHXC7U1sA9SeJN8rdV854xCOOOvLad9TVVYuWsXGzzfxzr/eZ9GsJR0GGpySyxw3KGK4xde1Odx5uzDEP8+pLCZ/LNg6cdjJB+P1d9z6WhX2PWRkEUrUPSLCyd87FrcvfQjH48rPz/wtD9z0GNN/cg8/O/km1n6avwmuToRbrroVbp460v9mC4BnH0fKY5xnwdaJurEjOOq/JiZn/HvxV/vxB3xc/Jvzut3fVCxVtQEOO3kcvnZLstxeN42bG1v3cQs1htiyYSt3/OjujmtSHZBrfxvktsV4qq6Gm3j2TAZY6r87D7j6gX9izuUw+WGjol1w6ve/xpdP/RIL31qMv8rPAUfsS1VtVbGL1S2Tr5qEv8rL64+8TSwWp8/AWgI1AdYsX9vmc6pKw9rNrFmxjl322CnD3Xou15FSaAm39TmNlEI3Rkv7/hSaH4Pgi0AUfIdB9RREyuMXW29kwdZFg4cM5PAzDyMaieZ1m+98cXvcnHHFKZx26YmEmsNU1Qb49fl/zvBhIZxh/psTSi3cIPtZCiJeqP5G4suUBQu2Lnr3ufd57M//YvO6LVT3reaEC4/kyCkTu7V3WSlwe9xU90nUNg8+bgxfLF9HpN2BLm63i6F7pT+MxSkt4ZbTPRwKN9h+lgJgKxUqgPWxdcEHry7gvl8+QsPazagqjZsbeer2F3j5/jeKXbScHH7mYey422D8yaPz3B43voCX82+Y3KZW2tjQxPsvzWPhrCVpdwXpqVxHSls40ecGtjtIJcmpxiYitwCnAGFgGfBtVW1womCl5Mm/PN+haRYKhvnXXS9x5NkTcaVZKF4O/FU+rrp7KnNmfsiCtxbTf4d+TDh9fJulYi8/8DpP3PZca9C5vR4uve0CdttniGPlyLlJ6sDqhBa2xrQy5Fpjmwnsp6oHAB8D1+RepNKz8fNNaV8PNYaJBDtO3i0nXp+HQ046iO/88my+fvmJbUJtxfyVPHn780RCUYKNidOvGhsaExtNOlRzc2qkFKzmZrbLKdhU9QVVbdmUbBYwNNvny9WOw9Mv+K7qG2g9Ab0S/eext4mEOu45F4tE+Xj2cseeY+FmnOZkH9t3gH85eL+ScdqlJ3aYA+YL+Dj1B18ru8GD7mja2pxxPluwKeTosyzcjJM6DTYReVFE5qf5mpTymWtJrBC+L8t9LhaR2SIyu75+ozOlL5BRh47kot+cx6577ozb62bw0EGcc+3XOz1pvdwdeNT+rQMLqaLRGHsdtIfjz8t1TSnkJ9xatj4y5aPTwQNVTX/UUZKIfAs4GThas0xXV9XpwHSA/fcb4/y09jwbPWFvRk/YO+/PCTWFmPPSPLZs2MqI/Ycz8uARRasVHnTMAbzx2Nt8ljzIRlyC1+fh1KnHU9M/+5bkPZXL1uKt93B4QAFsOki5yXVU9HjgKuAIVW1ypki916qPv+CP3/0rsVicSCiC1+dh99G7ccmfv43HW/gph26Pi8tuv4i5L89jzksfUt2nmomnj2f46GF5f3YuI6WQv3CzEdPykGsf221AH2CmiMwVkTscKFOvpKrcefW9NG1tJtQUIh6LE2oOs2Lep7z2f28VrVxuj4uDjxvDRb8+j//62RkFCTUn+tvA+WYpWL9buch1VHRPVR2mqmOTX99zqmC9zYbV9TSs29zh9XAowltPvVuEEhWXhZvJha08KBHZdtPIw0YbZcHCzfSUBVuJ2GHoIPoN7tvhdZ/fy6GnlPbZCvnkxEgpWLj1NhZsJUJEuPDmc6mqDSSmWAj4q/3sNmooX52cfgfcrgoFI7zy4Bv89oJp3H75DOa/scihUheGU2tK8xVuTp6EVclE5HgRWSwiS0Xk6jTv/0hEForIhyLykogMT3kvluzHnysiT3b2LNvdo4QM22dXfvn0NcyZ+SENG7awx/7D2Xv8njmtRY2Eo/zugr+w7pP1hJO7eCyds4Kvnj2BST843qmiF0SuI6WQn9FSsBHTzoiIG7gdOBZYBbwrIk+q6sKUj70PjFPVJhH5PvAbYHLyvWZVHdvV51mNrcRU1QaYcPp4TrroGPY9dGTOC+xnPz+X9Z9taA01gFBzmJfve53NG7bmWtyCcaq/DfJTcwNrmnZiPLBUVZerahh4EJiU+gFVfSVl2lhOSzStxlbh5r2+KMMpW26Wzv2Eg4/Zvwil6hknNqhsvZfV3DoVCUe784tksIjMTvl+enJSfoshwMqU71cB2ZbuXEDbJZqB5P2jwM2q+ni2wliwVbh+g/rgcruIpzl9qjZPqwfyyYkNKlvvZeGWld/j6c7gzQZVdWSUS0TOBcYBR6S8PFxVV4vIHsDLIjJPVZdluoc1RSvcxDMOwdNuK3MRqKoJsOeB5XmSuVODCeDcyVftWbO0g9VA6uzuocnX2hCRY4BrgVNVtXWnBVVdnfzncuBV4MBsD7Ngq3BD9tyF//p/Z+Cv8ROo8eOv8jFoyCAu/8tFuDMcpFwunAw3p/vbwEZM23kXGCkiI0TEB0wB2oxuisiBwF9JhNq6lNcHiIg/+efBwAQgddChA2uK9gJfOv5Axh65H58tWoWvys/QvXYp++2WnOxvA2fPT2ivUpqmuVDVqIhMBZ4H3MAMVV0gIjcCs1X1SeAWoBZ4OPn38zNVPRXYF/iriMRJVMZubjea2oEFWy/h9XupG1ueTc9MLNzKi6o+Czzb7rXrUv6cdichVX0T6NYoV3m3RUyv59TKhNb75alZCtbvVkgWbKbsOTmY0MLCrbxZsJmK4fRIqYVb+bJgMxXByZUJUJhwsxHT/LFgMxWj3MINrPaWLxZspqLkYzABLNzKjQWbqThODyZYuJUfCzZTsSzcei8LNlORnO5vg8KFmw0q5M6CzVSscg03sNpbrizYTEVzejABLNzKgQWb6RWcXplg4VbaLNhMxctHkxQs3EqZBZvpFSzcehcLNtNr5KO/DQobbjZi2jUWbKZXycdOIFC4cAOrvXWFBZvplSzcKpsFm+l18tXfBhZupcKCzfRKFm6VzYLN9Fr5GkyA/B3rl44NKnRkwWZ6tXwNJkB+z09Ix2pv21mwGUN+mqRQvHDr7SzYTK+Xz/42sHArBgs2Y8hvf1uLQoZbb+dIsInIlSKiyePnjSlL+e5vAwu3Qsk52ERkGHAc8FnuxTGm+Czcyp8TNbY/AFcB6sC9jCmqQvS3gYVbvuUUbCIyCVitqh904bMXi8hsEZldX78xl8cak1cWbuWv02ATkRdFZH6ar0nAT4HruvIgVZ2uquNUddzAgYNyLbcxeZXvwQQLt/zqNNhU9RhV3a/9F7AcGAF8ICKfAEOBOSKyc36LbEzh5KvWBhZu+dTjpqiqzlPVHVV1d1XdHVgFHKSqaxwrnTFFlO8mKVi45YvNYzMmCwu38uRYsCVrbhucup8xpaIQk3ct3JxlNTZjuiCfk3dbn2Hh5hgLNmO6wcKtPFiwGdNFhehvAws3J1iwGdMNhehvAwu3XFmwGdNNhehvAwu3XFiwGdNDFm6ly4LNmB4oVH8bWLj1hAWbMT1UqP42sHDrLgs2Y3JQqP42KOzJV+XOgs0YBxQy3KzW1jkLNmNyVMj+NrBw6woLNmMcYOFWWizYjHFIIQcTWli4pWfBZozDCj2YUC7hJiLHi8hiEVkqIlened8vIv+XfP9tEdk95b1rkq8vFpGvdfYsCzZjHFSMJimUfriJiBu4HTgBGAWcLSKj2n3sAmCTqu5J4pCoXyevHQVMAUYDxwN/Sd4vIws2YxxW6CZpmYTbeGCpqi5X1TDwIDCp3WcmAXcn//xP4GgRkeTrD6pqSFVXAEuT98vI42jRu2j+gg837DV66Kd5uPVgoFw2uyynskJ5lbecygr5Ke/wXG8wf8GHz+81emhXD0EPiMjslO+nq+r0lO+HACtTvl8FHNLuHq2fUdWoiGwGBiVfn9Xu2iHZClOUYFPVvMw0FJHZqjouH/d2WjmVFcqrvOVUVijd8qrq8cUuQ09ZU9QYUwirgWEp3w9Nvpb2MyLiAfoBG7t4bRsWbMaYQngXGCkiI0TER2Iw4Ml2n3kS+Gbyz2cCL6uqJl+fkhw1HQGMBN7J9rCiNEXzaHrnHykZ5VRWKK/yllNZofzK223JPrOpwPOAG5ihqgtE5EZgtqo+CdwF3CMiS4F6EuFH8nMPAQuBKHCJqsayPU8SgWiMMZXDmqLGmIpjwWaMqTgVGWwicqWIqIh0dQ5OUYjILSLykYh8KCKPiUj/Ypepvc6WwZQSERkmIq+IyEIRWSAilxe7TJ0REbeIvC8iTxe7LJWk4oJNRIYBxwGfFbssXTAT2E9VDwA+Bq4pcnna6OIymFISBa5U1VHAocAlJV5egMuBRcUuRKWpuGAjscbsKqDkR0VU9QVVjSa/nUVifk4p6coymJKhql+o6pzkn7eSCIysM9SLSUSGAicBdxa7LJWmooJNRCYBq1X1g2KXpQe+A/yr2IVoJ90ymJINilTJnSEOBN4ubkmy+iOJX8LxYhek0pTdPDYReRHYOc1b1wI/JdEMLRnZyquqTyQ/cy2JZtR9hSxbpRKRWuAR4IequqXY5UlHRE4G1qnqeyLy1WKXp9KUXbCp6jHpXheR/YERwAeJDQEYCswRkfGquqaARWwjU3lbiMi3gJOBo7X0JhV2eylLsYmIl0So3aeqjxa7PFlMAE4VkROBANBXRO5V1XOLXK6KULETdEXkE2CcqpbsLg8icjzwe+AIVV1f7PK0l1yv9zFwNIlAexc4R1UXFLVgGSS3uLkbqFfVHxa7PF2VrLH9WFVPLnZZKkVF9bGVoduAPsBMEZkrIncUu0CpkgMbLctgFgEPlWqoJU0AzgOOSv77nJusEZlepmJrbMaY3stqbMaYimPBZoypOBZsxpiKY8FmjKk4FmzGmIpjwWaMqTgWbMaYivP/Ad5JAM5iG3ynAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_train, y_train = create_toy_data()\n",
    "x1_test, x2_test = np.meshgrid(np.linspace(-5, 5, 100), np.linspace(-5, 5, 100))\n",
    "x_test = np.array([x1_test, x2_test]).reshape(2, -1).T\n",
    "\n",
    "feature = PolynomialFeature(degree=1)\n",
    "X_train = feature.transform(x_train)\n",
    "X_test = feature.transform(x_test)\n",
    "\n",
    "model = BayesianLogisticRegression(alpha=1.)\n",
    "model.fit(X_train, y_train, max_iter=1000)\n",
    "y = model.proba(X_test)\n",
    "\n",
    "plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train)\n",
    "plt.contourf(x1_test, x2_test, y.reshape(100, 100), np.linspace(0, 1, 5), alpha=0.2)\n",
    "plt.colorbar()\n",
    "plt.xlim(-5, 5)\n",
    "plt.ylim(-5, 5)\n",
    "plt.gca().set_aspect('equal', adjustable='box')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
